Skip to content
This repository has been archived by the owner on Jan 9, 2021. It is now read-only.

jarekb123/dart_dataclass

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DEPRECATED

This package is no longer mantained. Consider using Freezed package to define your data classes.

dataclass

License Github Stars

Packages Versions on PUB

  • dataclass - Pub Version
  • dataclass_generator - Pub Version

@DataClass annotation used for dataclass_generator

The DataClass generator generates base class for your data class with methods:

  • equals (operator ==)
  • hashCode
  • toString
  • copyWith

Getting Started

0. Add dependencies to pubspec.yaml

dependencies:
  dataclass: latest_version
dev_dependencies:
  dataclass_generator: latest_version

1. Annotate your class with @dataClass

The class should:

  • has only final fields
  • unnamed constructor with named parameters for all fields
@dataClass
class Car {
  final String name;
  final String manufacturer;
  final double price;

  Car({this.name, this.manufacturer, this.price});
}

2. Generate dataclass base class

Run pub run build_runner build

Generated file

abstract class _$Car {
  const _$Car();

  String get name;
  String get manufacturer;
  double get price;
  bool operator ==(other) {
    if (identical(this, other)) return true;
    if (other is! Car) return false;

    return true &&
        this.name == other.name &&
        this.manufacturer == other.manufacturer &&
        this.price == other.price;
  }

  int get hashCode {
    return mapPropsToHashCode([name, manufacturer, price]);
  }

  String toString() {
    return 'Car <\'name\': ${this.name},\'manufacturer\': ${this.manufacturer},\'price\': ${this.price},>';
  }

  Car copyWith({String name, String manufacturer, double price}) {
    return Car(
      name: name ?? this.name,
      manufacturer: manufacturer ?? this.manufacturer,
      price: price ?? this.price,
    );
  }
}

3. Extend class with generated base class

@dataClass
class Car extends _$Car {
  final String name;
  final String manufacturer;
  final double price;

  Car({this.name, this.manufacturer, this.price});
}

Collection equality

@dataClass
class Car extends _$Car {
  @Collection(deepEquality: true) // Short-hand: @Collection()
  final List<String> parts;

  const Car({this.parts});
}

FAQ

  1. Why you didn't use extension methods?

As the docs says that:

It is a compile-time error if an extension:

  • Declares a member with the same basename as a member declared by Object (==, hashCode, toString, noSuchMethod, runtimeType). This applies to both static and instance member declarations.
  1. May I use generics?

Yes.

About

Dart data class (equals, hashCode, toString, copyWith) methods generator

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •